# from langchain.agents import create_react_agent
# from langchain_community.agent_toolkits.load_tools import load_tools
# from langchain_community.llms.tongyi import Tongyi
# from langchain_core.prompts import ChatPromptTemplate
#
# # 初始化 Tongyi 语言模型
# llm = Tongyi()
#
# # 加载工具，例如数学计算工具
# tools = load_tools(["llm-math"], llm=llm)
#
# # 定义 prompt 模板
# prompt_template = '''
# 您是一个数学助手，可以访问以下工具来帮助解决问题：
#
# {tools}
#
# 请按照以下格式回答问题：
#
# Question: {input}
# Thought: 我应该使用哪个工具来解决这个问题？
# Action: 使用工具的名称 ({tool_names})
# Thought: 根据工具的输出结果，我得出最终答案
# Final Answer: 最终答案
# Agent Scratchpad: {agent_scratchpad}  # 存储之前的代理动作和工具输出
# 现在，请根据问题开始思考并执行相应的动作。
# '''
#
# # 创建 ChatPromptTemplate 实例
# prompt = ChatPromptTemplate.from_template(prompt_template)
#
# # 填充工具描述和工具名称
# tool_descriptions = "\n".join([f"{tool.name}: {tool.description}" for tool in tools])
# prompt = prompt.partial(
#     tools=tool_descriptions,
#     tool_names=", ".join([f"{tool.name}" for tool in tools]),
#     agent_scratchpad=""  # 初始化为空字符串
# )
#
# # 初始化 Agent，指定代理类型和工具
# agent = create_react_agent(
#     tools=tools,
#     llm=llm,
#     prompt=prompt
# )
#
# # 与 Agent 交互
# # 确保 invoke 方法的调用与 create_react_agent 函数的期望一致
# output_1 = agent.invoke({
#     "input": "现在告诉你4+5=10",
#     "intermediate_steps": []  # 添加一个空的 intermediate_steps 列表
# })
# output_2 = agent.invoke({
#     "input": "请问4+5=？ ",
#     "intermediate_steps": []  # 添加一个空的 intermediate_steps 列表
# })
#
# print(output_1)
# print('-------------------')
# print(output_2)

# import os
#
# os.environ["SERPAPI_API_KEY"] = '0fA485b7947AA6becd79b9098c191073'
# from langchain_community.llms.tongyi import Tongyi
#
# llm = Tongyi()
# from langchain.agents import load_tools
# from langchain.agents import initialize_agent
# from langchain.agents import AgentType
#
# tools = load_tools(["serpapi", "llm-math"], llm=llm)
#
# agent = initialize_agent(
#     tools,
#     llm,
#     agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,  # 这里有不同的类型
#     verbose=True,  # 是否打印日志
# )
# res = llm.invoke("请问2023年的美国总统是谁？他的年龄的除以2是多少?")
# print(res)

# from langchain_community.agent_toolkits.load_tools import load_tools
# from langchain.agents import create_react_agent, AgentExecutor
#
# from langchain_community.llms.tongyi import Tongyi
# from langchain_core.prompts import ChatPromptTemplate
#
# import os
# os.environ["SERPAPI_API_KEY"] = 'db166b810c6b85674b6ceab3bd4e10d5048e1ba837db1c0d962ad91b34558805'
#
# llm = Tongyi()
#
# tools = load_tools(["serpapi","llm-math"], llm=llm)
#
# prompt_template = '''
# 您是一个数学助手，可以访问以下工具来帮助解决问题：
#
# {tools}
#
# 请按照以下格式回答问题：
#
# Question: {input}
# Thought: 我应该使用哪个工具来解决这个问题？
# Action: 使用工具的名称 ({tool_names})
# Thought: 根据工具的输出结果，我得出最终答案
# Final Answer: 最终答案
# Agent Scratchpad: {agent_scratchpad}  # 存储之前的代理动作和工具输出
# 现在，请根据问题开始思考并执行相应的动作。
# '''
# # 创建 ChatPromptTemplate 实例
# prompt = ChatPromptTemplate.from_template(prompt_template)
# agent = create_react_agent(llm, tools, prompt)
# # res = llm.invoke("请问2023年的美国总统是谁？他的年龄的除以2是多少?")
# # print(res)
#
# agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# res = agent_executor.invoke({"input": "请问2023年的美国总统是谁？他的年龄的除以2是多少?", "chat_history": []})
#
# print(res)


from langchain_community.agent_toolkits.load_tools import load_tools
from langchain.agents import create_react_agent, AgentExecutor

from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory


from langchain_community.llms.tongyi import Tongyi
from langchain_core.prompts import ChatPromptTemplate

import os
os.environ["SERPAPI_API_KEY"] = '0fA485b7947AA6becd79b9098c191073'

llm = Tongyi()

tools = load_tools(["serpapi","llm-math"], llm=llm)

prompt_template = '''
您是一个助手，可以访问以下工具来帮助解决问题：
{tools}
请按照以下格式回答问题：
Question: {input}
Thought: 我应该使用哪个工具来解决这个问题？
Action: 使用工具的名称 ({tool_names})
Thought: 根据工具的输出结果，我得出最终答案
Final Answer: 最终答案
Agent Scratchpad: {agent_scratchpad}  # 存储之前的代理动作和工具输出
现在，请根据问题开始思考并执行相应的动作。
'''
# 创建 ChatPromptTemplate 实例
prompt = ChatPromptTemplate.from_template(prompt_template)
agent = create_react_agent(llm, tools, prompt)

agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

message_history = ChatMessageHistory()

agent_with_chat_history = RunnableWithMessageHistory(
    agent_executor,
    lambda session_id:message_history,
    input_messages_key="input",
    history_messages_key="chat_history",
)
res = agent_with_chat_history.invoke(
    {"input": "美国现任总统是谁？"},
    config={"configurable": {"session_id": "session-10086"}},
)

print(res)

res = agent_with_chat_history.invoke(
    {"input": "我上一句问的是什么？"},
    config={"configurable": {"session_id": "session-10086"}},
)
print('-----------------')
print(message_history)
